import time
import boolean2, pylab
from boolean2 import util, state
import matplotlib.pyplot as plt
import numpy as np

t0 = time.clock()
on = []
off = []
seen = {}
coll = [ ]

f = open('output_data.txt','w')

text = file('Cathelicidin Model Rules REV 4.txt').read()
text = boolean2.modify_states(text, turnon=on, turnoff=off)

num_sim = 1000
num_steps = 50
steps_split = [1,49]


avgs = [ ]
names = [ ]
#iterations through simulations
for i in range(num_sim):

    model = boolean2.Model( text=text, mode='rank')
    model.initialize()
    #model.iterate( steps=num_steps )
    for step_number in range(len(steps_split)):
        model.iterate( steps=steps_split[step_number] )
        #if (step_number == 0):
            #model.last.TCR_HIGH = False
            #model.last.TCR_LOW = False
            #model.last.AKT_OFF = True
            #model.last.MTORC1_OFF = True
            #model.last.NFAT_OFF = True
            #model.last.TGFBETA = True

    # output simulation results in several ways to the output file
    #print>>f, 'Element trajectories, run #', i+1, ' :'
    index = 0
    for node in model.data:
        if i == 0:
            names.append(node)
            avgs.append(model.data[node])
        else:
            for j in range(len(model.data[node])):
                avgs[index][j] = avgs[index][j] + model.data[node][j]
        if i == num_sim-1:
            for j in range(len(model.data[node])):
                avgs[index][j] = float(avgs[index][j])/float(num_sim)
        index = index+1
        #print>>f, node, ' ', (" ".join(str(z*1) for z in model.data[node]))

    #print>>f, '\n'
    #print>>f, model.detect_cycles()
    #print>>f, (" ".join(str(z) for z in model.nodes))
    #print>>f, '\n\n'
    
    coll.append(model.data)


for i in range(len(names)):
    print>>f, names[i], " ", (" ".join(str(z) for z in avgs[i]))
f.close()
print time.clock()-t0
